package com.ato.MyCollection;

import java.util.*;

/**
 * @author wangjing
 * @create 2021--11--06--16:22
 * 无序的，不可重复的！
 * Collection
 * Set
 * HashSet  :主要实现类，线程不安全，可以存储 null  值
 * LinkedHashSet  HashSet的子类， 链表结构： 有前后指针，快速插入 注意：是可以按照添加的顺序！！来遍历
 * TreeSet 2X树存储  可以按照添加对象的指定属性，排序！！
 * <p>
 * 1:无序性：
 * 并不是随机  底层还是数组,在存储时，并不是按照数组的索引来存储，而是按照hash值决定的
 * 2：不可重复性
 * 不能重复 注意：如果是自定义类，那么如果自定义类没有重写equals() 和 hashCode() 那么就是两个
 * equals()是用来比较的， hashCode()是用来排位置的。 注意 重写的equals()和hashCode()的重写必须一致
 */
public class SetTest {
    public static void main(String[] args) {

        HashSet hashSet = new HashSet();
        hashSet.add(123);
        hashSet.add(456);
        hashSet.add(new People("wj", 18));
        hashSet.add(new People("wj", 18));
        Iterator iterator = hashSet.iterator();

        while (iterator.hasNext()) {
            System.out.println(iterator.next());
            /*
                    456
                    People{name='wj', age=18}
                    123
                    People{name='wj', age=18}
            * */
        }

        // LinkedHashSet 按照添加的顺序遍历，在添加数据的同时，还维护了每个数据的两个变量（链表的引用），记录此数据的前一个和后一个
//        优点： 效率高
        LinkedHashSet linkedHashSet = new LinkedHashSet();
        linkedHashSet.add(123);
        linkedHashSet.add(456);
        Iterator iterator1 = linkedHashSet.iterator();
        while (iterator1.hasNext()) {
            System.out.println(iterator1.next());
            /*
             *   123
             *   456
             * */
        }
        /*
         *   TreeSet里添加的数据必须是同一个类的对象
         *
         * */
        TreeSet treeSet = new TreeSet();
        treeSet.add(21);
        treeSet.add(111);
        treeSet.add(4);
        treeSet.add(-1);
        treeSet.add(0);
        Iterator iterator2 = treeSet.iterator();
        while (iterator2.hasNext()) {
            System.out.println(iterator2.next());
        }

        TreeSet treeSet1 = new TreeSet();
        treeSet1.add(new People("s", 18));
        treeSet1.add(new People("a", 18));
        treeSet1.add(new People("b", 18));
        treeSet1.add(new People("b", 17));
        Iterator iterator3 = treeSet1.iterator();
        while (iterator3.hasNext()) {
            System.out.println(iterator3.next());
        }
//        定制排序
        TreeSet treeSet2 = new TreeSet();
        treeSet2.add(new People("s", 18));
        treeSet2.add(new People("a", 18));
        treeSet2.add(new People("b", 18));
        treeSet2.add(new People("b", 17));
        Comparator com = new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof People && o2 instanceof People) {
                    People p1 = (People) o1;
                    People p2 = (People) o2;
                    int i = p1.getName().compareTo(p2.getName());
                    if (i == 0) {
                        return Integer.compare(p1.getAge(), p2.getAge());
                    }
                    return i;
                } else {
                    throw new RuntimeException("数据格式错误");
                }

            }
        };

    }
}
